package br.com.hmm.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.com.hmm.entidade.Usuario;

public class UsuarioDAO {

	private Connection conn = null;
	private static final String INSERT_USUARIO = "INSERT INTO USUARIO(USU_ID, USU_LOGIN, USU_SENHA, USU_ADMIN, USU_ATIVO) VALUES(NULL, ?, ?, ?, ?)";
	private static final String UPDATE_USUARIO = "UPDATE USUARIO SET USU_LOGIN = ?, USU_SENHA = ?, USU_ADMIN = ?, USU_ATIVO = ?";
	private static final String DELETE_USUARIO = "DELETE FROM USUARIO WHERE USU_ID = ?";
	private static final String FIND_BY_NOME   = "SELECT USU_ID, USU_LOGIN, USU_SENHA, USU_ADMIN, USU_ATIVO FROM USUARIO WHERE USU_LOGIN LIKE '%?%'";
	private static final String FIND_BY_ID	   = "SELECT USU_ID, USU_LOGIN, USU_SENHA, USU_ADMIN, USU_ATIVO FROM USUARIO WHERE USU_ID = ?";
	private static final String EXISTE_USUARIO = "SELECT USU_ID, USU_LOGIN, USU_SENHA, USU_ADMIN, USU_ATIVO FROM USUARIO WHERE USU_LOGIN = ?";
	private static final String AUTENTICAR_USUARIO = "SELECT USU_ID, USU_LOGIN, USU_SENHA, USU_ADMIN, USU_ATIVO FROM USUARIO WHERE USU_LOGIN = ? AND USU_SENHA = ? AND USU_ATIVO = '1'";
	private static final String LISTAR_USUARIO = "SELECT USU_ID, USU_LOGIN, USU_SENHA, USU_ADMIN, USU_ATIVO FROM USUARIO;";
	
	public UsuarioDAO(){
		
	}
	
	/**
	 * 
	 * @param usuario
	 * @return
	 */
	public boolean inserir(Usuario usuario){
		PreparedStatement stmt = null;
		try {
			FabricaConexao.getInstancia();
			this.conn = FabricaConexao.conectar();
			stmt = this.conn.prepareStatement(INSERT_USUARIO);
			stmt.setString(1, usuario.getLogin());
			stmt.setString(2, usuario.getSenha());
			stmt.setString(3, usuario.getAdmin());
			stmt.setString(4, usuario.getAtivo());
			if(stmt.executeUpdate() > 0){
				return true;
			}
			
		}catch(Exception e){
			return false;
		}finally{
			DAOUtil.close(this.conn, stmt);
		}
		return false;
	}
	
	/**
	 * 
	 * @param usuario
	 * @return
	 */
	public boolean atualizar(Usuario usuario){
		PreparedStatement stmt = null;
		try {
			FabricaConexao.getInstancia();
			this.conn = FabricaConexao.conectar();
			stmt = this.conn.prepareStatement(UPDATE_USUARIO);
			stmt.setString(1, usuario.getLogin());
			stmt.setString(2, usuario.getSenha());
			stmt.setString(3, usuario.getAdmin());
			stmt.setString(4, usuario.getAtivo());
			if(stmt.executeUpdate() > 0){
				return true;
			}
		}catch(Exception e){
			return false;
		}finally{
			DAOUtil.close(this.conn, stmt);
		}
		
		return false;
}
	
	/**
	 * 
	 * @param usuario
	 * @return
	 */
	public boolean delete(Usuario usuario){
		PreparedStatement stmt = null;
		try {
			FabricaConexao.getInstancia();
			this.conn = FabricaConexao.conectar();
			stmt = this.conn.prepareStatement(DELETE_USUARIO);
			stmt.setInt(1, usuario.getId());
			if(stmt.executeUpdate() > 0 ){
				return true;
			}
		}catch(Exception e){
			return false;
		}finally{
			DAOUtil.close(this.conn, stmt);
		}
		
		return false;
	}
	
	/**
	 * 
	 * @param usuario
	 * @return
	 */
	public List<Usuario> findByNome(Usuario usuario){
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			FabricaConexao.getInstancia();
			this.conn = FabricaConexao.conectar();
			stmt = this.conn.prepareStatement(FIND_BY_NOME);
			stmt.setString(1, usuario.getLogin());
			List<Usuario> usuarios = new ArrayList<Usuario>();
			rs = stmt.executeQuery();
			while(rs.next()){
				Usuario u = new Usuario();
				u.setId(rs.getInt("USU_ID"));
				u.setLogin(rs.getString("USU_LOGIN"));
				u.setSenha(rs.getString("USU_SENHA"));
				u.setAdmin(rs.getString("USU_ADMIN"));
				u.setAtivo(rs.getString("USU_ATIVO"));
				usuarios.add(u);
			}
			if(!usuarios.isEmpty()){
				return usuarios;
			}
	}catch(Exception e){
		return null;
	}finally{
		DAOUtil.close(this.conn, stmt,rs);
	}
	
	return null;
 }
	
	/**
	 * 
	 * @param id
	 * @return
	 */
	public Usuario findById(int id){
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			FabricaConexao.getInstancia();
			this.conn = FabricaConexao.conectar();
			stmt = this.conn.prepareStatement(FIND_BY_ID);
			stmt.setInt(1, id);
			rs = stmt.executeQuery();
			if(rs.first() == true){
				Usuario u = new Usuario();
				u.setId(rs.getInt("USU_ID"));
				u.setLogin(rs.getString("USU_LOGIN"));
				u.setSenha(rs.getString("USU_SENHA"));
				u.setAdmin(rs.getString("USU_ADMIN"));
				u.setAtivo(rs.getString("USU_ATIVO"));
				return u;
				
			}
				
		
	}catch(Exception e){
		return null;
	}finally{
		DAOUtil.close(this.conn, stmt, rs);
	}
	
	return null;
}
	
	/**
	 * 
	 * @param usuario
	 * @return
	 */
	public boolean existeUsuario(Usuario usuario){
		PreparedStatement stmt = null;
		try {
			FabricaConexao.getInstancia();
			this.conn = FabricaConexao.conectar();
			stmt = this.conn.prepareStatement(EXISTE_USUARIO);
			stmt.setString(1, usuario.getLogin());
			if(stmt.getResultSet().first() == true){
				return true;
			}
	}catch(Exception e){
		return false;
	}finally{
		DAOUtil.close(this.conn, stmt);
	}
	
	return false;
 }
	
	/**
	 * 
	 * @param usuario
	 * @return
	 */
	public boolean autenticarUsuario(Usuario usuario){
		PreparedStatement stmt = null;
		try{
			FabricaConexao.getInstancia();
			this.conn = FabricaConexao.conectar();
			stmt = this.conn.prepareStatement(AUTENTICAR_USUARIO);
			stmt.setString(1, usuario.getLogin());
			stmt.setString(2, usuario.getSenha());
			if(stmt.execute() == true){
				return true;
			}
			
		}catch(Exception e){
			return false;
		}finally{
			DAOUtil.close(this.conn, stmt);
		}
		
		return false;
		
	}
	
	/**
	 * 
	 * @return
	 */
	public List<Usuario> list(){
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			FabricaConexao.getInstancia();
			this.conn = FabricaConexao.conectar();
			stmt = this.conn.prepareStatement(LISTAR_USUARIO);
			rs = stmt.executeQuery();
			List<Usuario> lu = new ArrayList<Usuario>();
 			while (rs.next()) {
				Usuario u = new Usuario();
				u.setId(rs.getInt("USU_ID"));
				u.setLogin(rs.getString("USU_LOGIN"));
				u.setSenha(rs.getString("USU_SENHA"));
				u.setAdmin(rs.getString("USU_ADMIN"));
				u.setAtivo(rs.getString("USU_ATIVO"));
				lu.add(u);
				
			}
 			if(!lu.isEmpty()){
 				return lu;
 			}
		}catch(Exception e){
			return null;
		}finally{
			DAOUtil.close(this.conn, stmt, rs);
			
		}
		
		return null;
	}
}
